// 读取配置文件

package conf

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"

	"gopkg.in/yaml.v2"
)

// 除配置文件外的配置信息
var (
	// 本服务名称
	ServerName = "web01"
	// 配置文件名称
	ServerConfig = ServerName + ".yaml"
	// pid 文件名称
	PidFileName = filepath.Join("/var/run", (ServerName + ".pid"))
	// 工作目录
	WorkDir = getPwd()

	// 服务日志
	LogPath     = getLogPath()
	LogFileName = ServerName + ".log"
	LogFile     = filepath.Join(LogPath, LogFileName)
	// gin 框架日志
	GinLogFileName = "gin.log"
	GinLogFile     = filepath.Join(LogPath, GinLogFileName)
	// 日志打卷保存数
	LogRotate = 5

	// web 地址
	Webaddr string
	// mysql 地址
	Mysqldsn string
)

// 存储配置文件的实例
var config = new(Config)

// 存储配置文件内容
type Config struct {
	Web struct {
		Port        string `yaml:"port"`
		Server_name string `yaml:"server_name"`
	} `yaml:"web"`
	Db struct {
		Mysql struct {
			User     string `yaml:"user"`
			Password string `yaml:"password"`
			Addr     string `yaml:"addr"`
			Database string `yaml:"database"`
		} `yaml:"mysql"`
	} `yaml:"db"`
}

// 初始化配置信息，读取配置文件
func InitConfig() {
	checkLogPath()

	data, err := ioutil.ReadFile(ServerConfigPath)
	if err != nil {
		log.Fatalf("[conf] %v read error: %v", ServerConfigPath, err.Error())
	}

	// 反序列化 yaml 配置文件
	err = yaml.Unmarshal(data, config)
	if err != nil {
		log.Fatalf("[conf] unmarshal yaml error: %v", err.Error())
	}

	Webaddr = WebAddr()
	Mysqldsn = MysqlDsn()
}

// 获取当前所在目录
func getPwd() string {
	pwd, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		log.Fatalf("[conf] pwd error: %v", err.Error())
	}

	return pwd
}

// 获取日志所在目录
func getLogPath() string {
	return filepath.Join(WorkDir, "logs")
}

// 验证日志目录是否创建
func checkLogPath() bool {
	_, exist := os.Stat(LogPath)
	if os.IsNotExist(exist) {
		err := os.Mkdir(LogPath, 0755)
		if err != nil {
			log.Fatalf("[conf] check log path error: %v", err.Error())
		}
	}

	return true
}

// 拼接 mysql 地址
func MysqlDsn() string {
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.Db.Mysql.User, config.Db.Mysql.Password, config.Db.Mysql.Addr, config.Db.Mysql.Database)
	return dsn
}

// 拼接 web 地址
func WebAddr() string {
	addr := fmt.Sprintf("%s:%s", config.Web.Server_name, config.Web.Port)
	return addr
}
